/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MailCliente;

import LibreriaServer.LServer;
import mailserver.MailServer1;
import Message.Mensaje;
import Persistencia.Archivo;
import SwConfMessage.Interfaz.IGuardarRecuperar;
import SwConfMessage.Interfaz.IMailCliente;
import SwConfMessage.Interfaz.IMensaje;
import SwConfMessage.Interfaz.IMostrar;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

/**
 * @author Marisol
 *
 * * @version 1.0.1 14 de Diciembre de 2013
 */
public class MailCliente implements IMailCliente {

    private IMostrar Server;
    private String Name;
    private ArrayList<Mensaje> listaMensajesCliente;
    private ArrayList<Mensaje> listaMensajesEnviados;
    private ImageIcon img;

    /**
     * Construtor recibe el nombre del usuario y el servidor.
     *
     * @param Name
     * @param Server
     */
    public MailCliente(String Name, IMostrar Server) {
        try {
            this.Server = Server;
            this.Name = Name;

            Archivo<MailCliente> binariocliente = new Archivo<MailCliente>();

            if (binariocliente.existe(LServer.patchUser(), Name, LServer.Dir)) {
                recuperar();
                return;
            }

            listaMensajesCliente = new ArrayList<Mensaje>();
            listaMensajesEnviados = new ArrayList<Mensaje>();
            img = new ImageIcon("foto.jpg");
            guardar();

        } catch (Exception ex) {
            Logger.getLogger(MailCliente.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
/**
 * Metodo que devuelve el sevidor
 * 
 * @return devuelce el servidor
 */
    public IMostrar getServer() {
        return Server;
    }
/**
 * Funcion que devuelve el nombre del usuario
 * 
 * @return nombre del usuario
 */
    public String getName() {
        return Name;
    }
/**
 * Metodo que devuelve la lista de mensajes del usuario
 * 
 * @return lista de mensajes del usuario
 */
    public ArrayList<Mensaje> getListaMensajesCliente() {
        return listaMensajesCliente;
    }
    
    
    /**
 * Metodo que devuelve la lista de mensajes enviados del usuario
 * 
 * @return lista de mensajes enviados del usuario
 */
    public ArrayList<Mensaje> getListaMensajesEnviados() {
        return listaMensajesEnviados;
    }

    
    
    public ImageIcon getImg() {
        return img;
    }

    public void setImg(ImageIcon img) {
        this.img = img;
    }
    

    
    
    
    
    /**
     * Este metodo consulta al servidor a fin de ver si el usuario tiene algun
     * mensaje. este metodo retorna unicamente la cantidad de mensajes que tiene
     * el usuario.
     *
     * @return
     */
    @Override
    public int checkMessages() {
        return ((MailServer1) Server).getMessagesWaitting(Name);
    }

    /**
     * Este metodo obtiene el siguiente mensajes del servidor y muestra el
     * mensaje al usuario.
     *
     * @return
     */
    @Override
    public IMensaje readNextMessage() {
        return (((MailServer1) Server).getNextMessage(Name));
    }

    /**
     * Este metodo metodo obtiene el mensaje completo del usuario con los datos
     * del destinatario,asunto,mensaje.
     *
     * @param Destino
     * @param Asunto
     * @param Mensaje
     */
    @Override
    public void sendMessage(String Destino, String Asunto, String Mensaje) {
        Mensaje mensaje = new Mensaje(Name, Destino, Asunto, Mensaje);
        ((MailServer1) (Server)).post(mensaje);
    }

  /**
   * Metodo envia mensaje al usuario
   * 
   * @param mensaje 
   */  
    
    public void sendMessage(Mensaje mensaje) {
        listaMensajesCliente.add(mensaje);
        guardar();
    }

    
   /**
   * Metodo envia mensaje al usuario
   * 
   * @param mensaje 
   */  
    
    public void bandejadMessage(Mensaje mensaje) {
        listaMensajesEnviados.add(mensaje);
        guardar();
    }
 
    

/**
 * Metodo que compara los mensajes
 * 
 * @param mensaje1
 * @param mensaje2
 * @param posicion 
 */
    private void mensajesIguales(String mensaje1, String mensaje2, int posicion) {

        if (mensaje1.equals(mensaje2)) {
            listaMensajesCliente.remove(posicion);

        }

    }

    /**
     * Metodo que elimina el mensaje
     * 
     * @param namecliente
     * @param texto 
     */
    public void eliminarTexto(String namecliente, String texto) {

        int cantidadMensajes = listaMensajesCliente.size();
        while (cantidadMensajes > 0) {
            cantidadMensajes--;
            Mensaje mensaje = listaMensajesCliente.get(cantidadMensajes);
            mensajesIguales(mensaje.mensaje(), texto, cantidadMensajes);
        }

    }

  
    
    
    
    @Override
    public void guardar() {
        try {
            String Pach = LServer.patchUser();
            Archivo<MailCliente> binarioClient = new Archivo<MailCliente>();
            binarioClient.guardar(this, Pach, Name, LServer.Dir);
        } catch (Exception ex) {
            Logger.getLogger(MailServer1.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void recuperar() {

        try {
            String Pach = LServer.patchUser();
            Archivo<MailCliente> binarioServer = new Archivo<MailCliente>();
            MailCliente cliente = binarioServer.recuperar(Pach, Name, LServer.Dir);
            this.listaMensajesCliente = cliente.listaMensajesCliente;
            this.listaMensajesEnviados = cliente.listaMensajesEnviados;
            this.img = cliente.img;
        } catch (Exception ex) {
            Logger.getLogger(MailServer1.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
//      public static void main(String[] args) {
//        // TODO code application logic here
//    }
}
